/**
 * 软件著作权：
 *
 * 系统名称：  云序列
 *
 * 文件名称：  DomainDao.java
 *
 * 功能描述：  域名数据访问对象
 * 
 * 版本历史：
 * 
 * 2015-10-11   1.0.0版 （龙色波）（创建文件）
 */
package com.dfhc.base.domain.dao;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.quickbundle.base.beans.factory.RmIdFactory;
import org.quickbundle.project.RmProjectHelper;
import org.quickbundle.project.common.vo.RmCommonVo;
import org.quickbundle.third.mybatis.RmSqlSessionDaoSupport;
import org.springframework.stereotype.Repository;

import com.dfhc.base.domain.IDomainConstants;
import com.dfhc.base.domain.vo.DomainVo;
import com.dfhc.util.StringHelper;

/**
 * 域名数据访问对象
 * 
 * @author 龙色波
 * @see 参见的类
 */
@Repository
public class DomainDao extends RmSqlSessionDaoSupport implements IDomainConstants {
	//插入语句
	private final static String SQL_INSERT = "insert into "+TABLE_NAME+"("+FIELD_ID+","+FIELD_NAME+","+FIELD_REMARK+") values(?,?,?)";
	//删除语句
	private final static String SQL_DELETE = "delete from "+TABLE_NAME+" where "+FIELD_ID +"=?";
	//更新语句
	private final static String SQL_UPDATE = "update "+TABLE_NAME+" set "+FIELD_ID+"=?,"+FIELD_NAME+"=?,"+FIELD_REMARK+"=? where "+FIELD_ID+"=?";
	//根据id查询
	private final static String SQL_GETBYID= "select * from "+TABLE_NAME+" where "+FIELD_ID+"=?";
    /**
     * 插入单条记录，用id作主键
     * 
     * @param vo 用于添加的VO对象
     * @return 若添加成功，返回新生成的id
     */
    public String insert(DomainVo vo) {
        if(vo.getId() == null || vo.getId().length() == 0) {
            vo.setId(RmIdFactory.requestId(TABLE_NAME)); //获得id
        }
        Object values[]={vo.getId(),vo.getName(),vo.getRemark()};
        RmProjectHelper.getCommonServiceInstance().doUpdate(SQL_INSERT, values);
        return vo.getId();
    }

    /**
     * 批更新插入多条记录，用id作主键
     * 
     * @param vos 添加的VO对象数组
     * @return 若添加成功，返回新生成的id数组
     */
    public String[] insert(DomainVo[] vos) {
        String[] ids =RmIdFactory.requestId(TABLE_NAME, vos.length); //批量获得id
        for(int i=0; i<vos.length; i++) {
            vos[i].setId(ids[i]);
        }
        
        Object[][] values;
        values= new Object[vos.length][];
        for(int i=0;i<values.length;i++){
        	values[i] = new Object[3];
        	values[i][0]=vos[i].getId();
        	values[i][1]=vos[i].getName();
        	values[i][2]=vos[i].getRemark();
        }
		RmProjectHelper.getCommonServiceInstance().doUpdateBatch(SQL_INSERT, values);
       
        return ids;
    }
    
    /**
     * 删除单条记录
     * 
     * @param id 用于删除的记录的id
     * @return 成功删除的记录数
     */
    public int delete(String id) {
    	Object[] values={id};
    	return RmProjectHelper.getCommonServiceInstance().doUpdate(SQL_DELETE, values);
    }

    /**
     * 删除多条记录
     * 
     * @param id 用于删除的记录的id
     * @return 成功删除的记录数
     */
    public int delete(String ids[]) {
        if(ids == null || ids.length == 0) {
            return 0;
        }
        Object[][] values;
        values= new Object[ids.length][];
        for(int i=0;i<values.length;i++){
        	values[i] = new Object[1];
        	values[i][0]=ids[i];
        }
		int[] delRows = RmProjectHelper.getCommonServiceInstance().doUpdateBatch(SQL_DELETE, values);
		int sum=0;
		for(int num:delRows){
			sum +=num;
		}
		return sum;
    }

    /**
     * 更新单条记录
     * 
     * @param vo 用于更新的VO对象
     * @return 成功更新的记录数
     */
    public int update(DomainVo vo) {
    	  Object values[]={vo.getId(),vo.getName(),vo.getRemark(),vo.getId()};
          return RmProjectHelper.getCommonServiceInstance().doUpdate(SQL_UPDATE, values);
    }

    /**
     * 批量更新修改多条记录
     * 
     * @param vos 添加的VO对象数组
     * @return 成功更新的记录数组
     */
    public int[] update(DomainVo[] vos) {
    	 Object[][] values;
         values= new Object[vos.length][];
         for(int i=0;i<values.length;i++){
         	values[i] = new Object[4];
         	values[i][0]=vos[i].getId();
         	values[i][1]=vos[i].getName();
         	values[i][2]=vos[i].getRemark();
         	values[i][3]=vos[i].getId();
         }
 		return RmProjectHelper.getCommonServiceInstance().doUpdateBatch(SQL_UPDATE, values);
    }

    /**
     * 根据Id进行查询
     * 
     * @param id 用于查找的id
     * @return 查询到的VO对象
     */
    public DomainVo get(String id) {
    	RmCommonVo commVo = RmProjectHelper.getCommonServiceInstance().doQueryForObject(StringHelper.replaceAll(SQL_GETBYID, "?", "'"+id+"'").toString());
    	if(commVo!=null){
    		DomainVo vo = new DomainVo();
    		vo.setId(commVo.getString(FIELD_ID));
    		vo.setName(commVo.getString(FIELD_NAME));
    		vo.setRemark(commVo.getString(FIELD_REMARK));
    		return vo;
    	}
        return null;
    }
    
    /**
     * 查询总记录数，带查询条件
     * 
     * @param searchPara 查询条件Map
     * @return 总记录数
     */
    public int getCount(Map<String, Object> searchPara) {
    	String sql="select count(*) from "+ TABLE_NAME +" where 1= 1";
    	sql = makeWhere(searchPara, sql);
        return RmProjectHelper.getCommonServiceInstance().doQueryForInt(sql);
    }
    /**
     * 构造where子句
     * @param searchPara
     * @param sql
     * @return
     */
	private String makeWhere(Map<String, Object> searchPara, String sql) {
		if(!StringHelper.isEmpty((String)searchPara.get(FIELD_NAME))){
    		sql=sql+" and "+FIELD_NAME+"='"+searchPara.get(FIELD_NAME)+"'";
    	}
    	if(!StringHelper.isEmpty((String)searchPara.get(FIELD_ID))){
    		sql=sql+" and "+FIELD_ID+"='"+searchPara.get(FIELD_ID)+"'";
    	}
    	if(!StringHelper.isEmpty((String)searchPara.get(FIELD_REMARK))){
    		sql=sql+" and "+FIELD_REMARK+"='"+searchPara.get(FIELD_REMARK)+"'";
    	}
		return sql;
	}
    
    /**
     * 功能: 通过组合后的查询条件获得所有的VO对象列表，带翻页，带排序字符
     *
     * @param searchPara 查询条件Map
     * @param orderStr 排序字符
     * @param startIndex 开始位置(第一条是1，第二条是2...)
     * @param size 查询多少条记录(size小于等于0时,忽略翻页查询全部)
     * @param selectAllClumn 是否查询所有列，即 SELECT * FROM ...(适用于导出)
     * @return 查询到的VO列表
     */
    public List<DomainVo> list(Map<String, Object> searchPara, String orderStr, int startIndex, int size, boolean allClumn) {
        searchPara.put("orderStr", orderStr);
        String sql="select * from "+TABLE_NAME+" where 1=1";
        sql = makeWhere(searchPara, sql);
        if(!StringHelper.isEmpty(orderStr)){
        	sql =sql+" order by "+orderStr;
        }
        List<RmCommonVo> vos = RmProjectHelper.getCommonServiceInstance().doQueryStartIndex(sql, startIndex, size);
        List<DomainVo> retVos = new ArrayList<DomainVo>();;
        if(vos!=null){
        	for(RmCommonVo vo:vos){
        		DomainVo domainVo = new DomainVo();
        		domainVo.setId(vo.getString(FIELD_ID));
        		domainVo.setName(vo.getString(FIELD_NAME));
        		domainVo.setRemark(vo.getString(FIELD_REMARK));
        		retVos.add(domainVo);
        	}
        }
        return retVos;
    }
    

   
}
